# -*- coding:utf-8 -*-

'''
项目初始化 管理app的创建/db创建/csrf保护/redis/Session/项目日志
'''
import logging
from logging.handlers import RotatingFileHandler

import redis
from flask import Flask
from flask.ext.session import Session
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.wtf import CSRFProtect

from config import Config, DevelopmentConfig

# 普通创建文件的方式
# # 创建app示例对象
# app = Flask(__name__)
#
# # 加载配置参数
# app.config.from_object(Config)
#
# # 创建db对象
# db = SQLAlchemy(app)

# 通过提供create_app函数,实现app创建以及相关配置的封装

from ihome.utils.common import RegexConverter

# 所有的Flask扩展可以延迟加载,先在函数外部定义对象,方便别的文件导入,延迟传入app来加载相关配置
# 一开始不传入app
db = SQLAlchemy()

# 方便其他模块使用redis_store来操作redis
redis_store = None

# 设置日志的记录等级
logging.basicConfig(level=logging.DEBUG)  # 调试debug级
# 创建日志记录器，指明日志保存的路径、每个日志文件的最大大小、保存的日志文件个数上限
file_log_handler = RotatingFileHandler("logs/log", maxBytes=1024 * 1024 * 100, backupCount=10)
# 创建日志记录的格式                 日志等级    输入日志信息的文件名 行数    日志信息
formatter = logging.Formatter('%(levelname)s %(filename)s:%(lineno)d %(message)s')
# 为刚创建的日志记录器设置日志记录格式
file_log_handler.setFormatter(formatter)
# 为全局的日志工具对象（flask app使用的）添加日志记录器
logging.getLogger().addHandler(file_log_handler)


def create_app():
    # 创建app实例对象
    app = Flask(__name__)

    # 加载配置参数
    app.config.from_object(DevelopmentConfig)
    # 将自定义转换器添加到转换器字典中
    app.url_map.converters['re'] = RegexConverter

    # # 创建db对象
    # db = SQLAlchemy(app)
    # 延迟加载app
    db.init_app(app)

    # csrf保护,针对post/put/delete等修改数据的请求方式,需要开启保护
    CSRFProtect(app)

    # 创建redis
    global redis_store
    # globals(redis_store)
    redis_store = redis.StrictRedis(port=Config.REDIS_PORT, host=Config.REDIS_HOST)

    # 创建Flask-Session,讲保存在浏览器cookie中的session信息,同步到你设置的地方
    Session(app)

    # 注册蓝图
    # 蓝图的导入,可以用到时再加入,避免循环导入的的问题
    # print '注册蓝图 api begin'
    from ihome.api_1_0 import api
    # print '注册蓝图 正式操作 ing'
    app.register_blueprint(api)
    # print '注册蓝图 api ends'

    from ihome.web_html import html
    app.register_blueprint(html)

    # 返回db/app对象
    return db, app
